#ifndef OVERVIEW_VIEW_H
#define OVERVIEW_VIEW_H

#include <QWidget>
#include <QtCharts>
#include "state_info.h"
#include "dealer_handler.h"
#include "data_view.h"
#include "alarm_record.h"
#include "alarm_rule.h"

namespace Ui
{
    class OverviewView;
}

class OverviewView : public QWidget
{
    Q_OBJECT

public:
    explicit OverviewView(QWidget *parent = nullptr);
    ~OverviewView();
    /**
     * @brief 初始化数据总览
     */
    void initDataOverview();
    /**
     * @brief 更新数据总览
     */
    void updateDataOverview();

    /**
     * @brief 初始化最近5个周期控制指令和设值指令总数
     */
    void initControlInstructionCycle();
    /**
     * @brief 更新最近5个周期控制指令和设值指令总数
     */
    void updateControlInstructionCycle();

    /**
     * @brief 刷新最近5个周期控制指令和设值指令总数
     */
    void refreshControlInstructionCycle();

    /**
     * @brief 初始化控制指令
     */
    void initControlInstruction();
    /**
     * @brief 更新控制指令
     */
    void updateControlInstruction();

    /**
     * @brief 刷新控制指令
     */
    void refreshControlInstruction();

    /**
     * @brief 初始化告警列表
     */
    void initTrafficAlarm();
    /**
     * @brief 更新告警列表
     */
    void updateTrafficAlarm();

    /**
     * @brief 刷新告警列表
     */
    void refreshTrafficAlarm();

    /**
     * @brief 初始化实时控制指令列表
     */
    void initRealInstructionList();
    /**
     * @brief 更新实时控制指令列表
     */
    void updateRealInstructionList();

    /**
     * @brief 刷新实时控制指令列表
     */
    void refreshRealInstructionList();

    /**
     * @brief 初始化告警列表
     */
    void initAlarmList();
    /**
     * @brief 更新告警列表
     */
    void updateAlarmList();

    /**
     * @brief 刷新告警列表
     */
    void refreshAlarmList();

public slots:
    /**
     * @brief 定时器超时
     */
    void on_timeout();
    /**
     * @brief 网络应答信号槽
     */
    void onNetworkMessageReceived(const QString &method, const QString &body);

private:
    void appendAlarmRecord(int64_t id, int status, int64_t alarm_rule_id, int64_t substation_id, QString substation_desc,
                          int64_t point_id, int point_address, double max_threshold, int64_t create_at, int64_t update_at,
                          int interval_secs, double threshold_value, MetricTypeEnum metric_type, ThresholdUnitEnum threshold_unit, AlarmLevelEnum alarm_level);

private:
    Ui::OverviewView *ui_;
    QTimer *index_timer_;
    QChartView *chart_view_top5_, *chart_view_ctrl_, *chart_view_warn_;
    StateInfo *state_info_;                   ///< 主站信息
    std::vector<StateInfo *> state_info_vec_; ///< 子站信息列表
    DealerHandler *dealer_handler_;           ///< 网络管理器
    int control_instruct_num_;               ///< 控制指令总数
    int alarm_num_;                          ///< 告警总数
    /**
     * @brief 查询结果
     */
    QVector<SelectFramesResult> select_frames_result_;

    /**
     * @brief 告警记录列表
     */ 
    QVector<AlarmRecord *> alarm_record_vec_;

    /**
     * @brief 最近30天告警数量
     */
    QVector<int> last_30days_alarm_count_;

    /**
     * @brief 最近5个周期控制指令和设值指令总数
     */
    std::vector<std::vector<double>> ctrl_list_;
    std::vector<std::vector<double>> set_list_;
    /**
     * @brief 周期类型
     */
    QStringList categories_;

    /**
     * @brief 最近30天控制指令数量
     */
    std::vector<int> control_instruction_vec_;

    /**
     * @brief 控制指令类别
     */
    QStringList control_instruction_categories_;

    /**
     * @brief 告警序列
     */
    std::vector<int> raffic_alarm_vec_;

    /**
     * @brief 告警类别
     */
    QStringList traffic_alarm_categories_;
    
};

#endif // OVERVIEW_VIEW_H
